Many different types of applications can be arranged to run on clusters of computing nodes. By splitting out computational tasks and data storage between the nodes of a cluster, applications can be more readily scaled by including additional nodes within the cluster. However, in the design of such applications, it is necessary to mitigate any issues that may arise due to the failure of nodes within the cluster. Such applications may require each of the nodes in the cluster to be synchronized such that there can be considered to be a master clock with respect to which operations within the cluster can be performed. An example of such an application is a distributed transactional memory system. In a distributed transactional memory system, it is necessary to ensure that transactions are carried out within the cluster in strict sequential order so that the integrity of the memory system is preserved even where transactions are processed by different nodes in the cluster. Similarly, the timing of other operations relating to the memory system, such as garbage collection of historical versions of objects (where the memory system supports multi-versioning) also needs precise coordination between the nodes of the cluster. One known solution for synchronizing the nodes of a cluster is to provide a resilient (i.e. highly reliable) master clock signal to each of the nodes in the cluster.
The embodiments described below are not limited to implementations which solve any or all of the disadvantages of known clusters of nodes.